While - cyklus s podmínkou

V předcházejících lekcích jsme používali příkaz repeat pro opakování příkazů, pokud jsme věděli, kolikrát se budou opakovat. Jiná situace nastane, kdy dopředu neznáme počet opakování, ale chceme ho ukončit za nějaké podmínky. Takový případ je možné řešit pomocí rekurze, například proceduru brusle z lekce 13. by bylo možné zastavit takto:
to brusle
pu fd 5 wait 50
text1'setvalue "jedu
if dotcolour="taupe5 [stop]
brusle
end
Procedura se opakuje díky rekurzi a zastaví se, pokud barva bodu, na který želva "přijela" je taupe5 (if dotcolour="taupe5 [stop] ).
Využití rekurze přináší ale jeden problém, který není patrný u našich "miniprogramů", ale komplikoval by provoz u větších projektů. Při rekurzi se totiž plní operační paměť tzv. návratovými adresami (po dokončení cyklu se program musí "vrátit" zpět, aby dokončil rozpracované procedury). Proto se v programátorské praxi rekurze používá spíše jen k řešení speciálních úloh a pro opakování do určité podmínky se používají jiné příkazy.

Pro opakování příkazů do splnění dané podmínky je v Imagine (podobně jako v jiných programovacích jazycích) určen příkaz while (dokud):
while [podmínka] [příkazy]
Překlad a princip je jednoduchý: dokud je splněna podmínka vykonej příkazy , podmínka i příkazy jsou uzavřeny v hranatých závorkách.

Podmínky mohou být samozřejmě různé, v minulé lekci byla jako podmínka k volbě pozice "koruny" využita barva bodu:
to pozice
ht setpos any
while [dotcolour<>"orange11] [setpos any]
st
end
Tato procedura hledá náhodnou pozici tak dlouho, dokud je barva různá od orange11, to byla barva pozadí papíru. (Pokud je barva jiná, pak to znamenalo, že želvička stojí na nějaké překážce.)

Velice často bývá podmínkou nějaká hodnota proměnné, například:
to cisla
make"a 1
while [:a<10] [make"a :a+1 pr :a]
end
Procedura cisla nejprve uloží do proměnné a číslo 1 a potom vždy zvětší a o jedničku a vytiskne ho, tak dlouho dokud je a menší než devět. Rozmyslete si důkladně, proč se v této proceduře vytisknou čísla od 1 do 10! Vždy se nejprve zkontroluje podmínka a potom se vykonají příkazy, takže pro a rovno 9 je podmínka splněná a vykonají se příkazy (a se zvětší o 1 a vytiskne se).


Projekt KAPKA

Další jednoduchá hra nás zachrání před smrtí žízní :-) . Úkolem je do nádoby, kterou pohybujeme doleva a doprava, pochytat co nejvíce kapek padajících shůry.

Základ hry je stejný jako v minulé lekci, želvička, kterou budeme pohybovat zná následující proceduru:
to pohyb
every 1[
tofront
if key? [make"a readkey]
if :a=-77 [setheading 90 fd 2]
if :a =-75 [setheading 270 fd 2]
wait 10
]
end
Oproti minulé lekci přibyl jen příkaz tofront, který zajistí, aby tato želvička byla vždy vepředu (aby ji padající kapka "nepřekryla").

Druhá želvička (kapka) vykonává tuto proceduru padej:
to padej
st
make"x -200+random(400)
make"y 200
setxcor :x setycor :y
while [:y>-150] [bk 1 make"y :y-1 wait 10]
ifelse overlapped=[t1] [ ] [make"zivoty :zivoty-1 text2'setvalue " printtotextbox"text2 (pr :zivoty) ]
ht
end

Novinkou v této proceduře jsou příkazy setxcor, setycor, pomocí kterých lze želvičku přemístit na konkrétní souřadnice x a y. Stejně jako v matematice se souřadnice x zjišťuje na vodorovné ose a souřadnice y na svislé ose. Počátek souřadnic (průsečík os x a y), bod se souřadnicemi [0,0] je uprostřed stránky nebo papíru. Hodnoty x rostou zleva doprava, vlevo od nuly jsou záporné, hodnoty y klesají shora dolů, pod nulou jsou záporné (viz obrázek). Krajní hodnoty jsou závislé na velikosti stránky nebo papíru.
V proceduře padej potom želvička couvá (dolů) tak dlouho, dokud je její y-ová souřadnice větší než -150. Potom se cyklus while zastaví a na dalším řádku se zkontroluje (overlapped), jestli "kapka" narazila do želvičky t1.

Sartovací procedura celého projektu spustí pohyb první želvičky a pád druhé želvičky:
to start
t1'pohyb
make"zivoty 3
text2'setvalue " printtotextbox"text2 (pr :zivoty)
t2'padej
stopall
end



Projekt ulož pod názvem kapka.imp !

Úkol:

Základní úloha:

Ze složky s lekcemi si zkopíruj do své složky projekt kapka.imp (odsud pomocí pravého tlačítka a Uložit cíl jako..). Doplň do něj:
- další proměnnou, pomocí které se bude počítat počet chycených kapek
- do spodní části stránky doplň textové pole, do kterého se bude vypisovat počet chycených kapek
- uprav hlavičku (papír s pozadím), želvy a další vzhled


Úloha na plus:

Uprav projekt tak, aby probíhal dokud je počet životů větší než nula.


Úloha na jedničku:

K základní úloze a úloze na plus doplň závislost rychlosti kapek na počtu chycených kapek (čím více chycených kapek, tím větší bude jejich rychlost).

Úloha navíc:

V tomto projektu se želvička pohybuje "samovolně" podle poslední stisknuté klávesy. Zkus upravit proceduru pohyb tak, aby bylo pro pohyb nutné držet klávesu, nebude-li stisknutá klávesa, želvička bude stát.